import axios from "axios";
import eventBus from "./eventBus.ts";

axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";

const errorCode: Record<string, string> = {
  "401": "认证失败，无法访问系统资源",
  "403": "当前操作没有权限",
  "404": "访问资源不存在",
  default: "系统未知错误，请反馈给管理员",
};

const id = window.localStorage.getItem("qrcode");

// 创建 axios 实例
const service = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API, // 公共部分 URL
  timeout: 10000 * 200, // 超时时间
});

// 请求拦截器：添加 qrCodeId 参数和支持文件上传逻辑
service.interceptors.request.use(
  (config) => {
    const qrCodeId = id; // 默认添加的 qrCodeId
    const isFileUpload = config.headers?.["Content-Type"] === "multipart/form-data";

    if (isFileUpload) {
      // 如果是文件上传，使用 FormData
      const formData = new FormData();
      if (config.data instanceof Object) {
        Object.entries(config.data).forEach(([key, value]) => {
          formData.append(key, value as Blob | string);
        });
      }
      // 添加 qrCodeId 到 FormData
      formData.append("qrCodeId", qrCodeId || "");
      config.data = formData;
    } else if (config.method === "get") {
      // 对 GET 请求，添加到 URL 参数中
      config.params = { ...(config.params || {}), qrCodeId };
    } else {
      // 对非 GET 请求，添加到请求体中
      config.data = { ...(config.data || {}), qrCodeId };
    }

    return config;
  },
  (error) => {
    // 请求错误处理
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (res) => {
    const code = res.data.code || 200;
    if (code === 200) {
      return Promise.resolve(res.data);
    }
    eventBus.emit("message", res.data.msg);
    return Promise.reject(new Error(errorCode[code] || errorCode["default"]));
  },
  (error) => {
    // 响应错误处理
    eventBus.emit("message", error.message);
    return Promise.reject(error);
  }
);

export default service;
